#include "Cliente.h"
#include "Mensajes.h"
#include "FuncionesAuxiliares.h"
#include <getopt.h>
#include <iostream>
#include <string>
#include <sstream>

#define PETICION -2

using namespace std;


void imprimeUso() {
	cout << "   -= ConcuDB =-" << endl;
	cout << "\n\t-h, --help" << endl;
	cout << "\tImprime este mensaje de uso" << endl;
	cout << "\n\t-a , --alta" << endl;
	cout << "\n\t-m , --modificacion" << endl;
	cout << "\n\t-c , --consulta" << endl;
	cout << "\t\tSe debe ingresar uno (y sólo uno) de estos comando obligatoriamente" << endl;
	cout << "\n\t-n NOMBRE, --nombre=\"NOMBRE\"\t(Entre comillas dobles)" << endl;
	cout << "\n\t-d DIRECCION, --direccion=\"DIRECCION\"\t(Entre comillas dobles)" << endl;
	cout << "\n\t-t TELEFONO, --telefono=TELEFONO" << endl;
	cout << "\t\tDatos a modificar o dar de alta." << endl; 
	cout << "\t\tLa consulta se puede realizar por uno (y sólo uno) de estos campos." << endl; 
}


int main(int argc, char **argv) {
	
	const char* const op_cortas = "hamcn:d:t:" ;

	/* Una estructura de varios arrays describiendo los valores largos */
	const struct option op_largas[] =
	{ 
	  { "help",     	 0,  NULL, 'h'},
	  { "alta",     	 0,  NULL, 'a'},
	  { "modificacion",  0,  NULL, 'm'},
	  { "consulta",      0,  NULL, 'c'},
	  { "nombre",        1,  NULL, 'n'},
	  { "direccion",     1,  NULL, 'd'},
	  { "telefono",      1,  NULL, 't'},
	  { NULL,        	 0,  NULL,  0}
	};
	
	int sigOpc = 1, tipoPeticion = -1;
	string nombre = "", direccion = "", telefono = "";
	
	while (sigOpc) {
		sigOpc = getopt_long (argc, argv, op_cortas, op_largas, NULL);
		
		if (sigOpc == -1) break;
		
		switch (sigOpc) {
			case 'h' : 				/* -h o --help */
				imprimeUso();
				return 0;

			case 'a' : 				/* -a o --alta */
				tipoPeticion = ALTA;
				break;
				
			case 'm' : 				/* -m o --modificacion */
				tipoPeticion = MODIFICACION;
				break;
				
			case 'c' : 				/* -c o --consulta */
				tipoPeticion = PETICION;
				break;

			case 'n' : 				/* -n ó --nombre */
				nombre = string(optarg);
				if (tipoPeticion != ALTA && tipoPeticion != MODIFICACION)
					tipoPeticion = PETICION_NOMBRE;
				break;
				
			case 'd' : 				/* -d o --direccion */
				direccion = string(optarg);
				if (tipoPeticion != ALTA && tipoPeticion != MODIFICACION)
					tipoPeticion = PETICION_DIRECCION;
				break;

			case 't' : 				/* -t o --telefono */
				telefono = string(optarg);
				if (tipoPeticion != ALTA && tipoPeticion != MODIFICACION)
					tipoPeticion = PETICION_TELEFONO;
				break;

			case '?' : 				/* opción no valida */
				imprimeUso(); 
				return 1;
		}
	}

	if (tipoPeticion < 0) {
		imprimeUso();
		return 0;
	}
	
	Cliente cliente;
	string parametrosAEnviar = nombre + SEPARADOR + direccion + SEPARADOR + telefono;
	mensaje respuesta = cliente.enviarPeticion(parametrosAEnviar, tipoPeticion);
	
	string datos = string(respuesta.texto);
	if (datos.find(SEPARADOR) != string::npos) {
		cout << "Nombre y Apellido: " << parsearPeticion(datos, PETICION_NOMBRE) << endl;
		cout << "Direccion: " << parsearPeticion(datos, PETICION_DIRECCION) << endl;
		cout << "Teléfono: " << parsearPeticion(datos, PETICION_TELEFONO) << endl;
	}
	else
		cout << "Respuesta del servidor: " << datos << endl;
	
	return 0;
}